package com.zjj.learn.designmodel.work.memento;



public class MementoTest {

    public static void main(String[] args) {

    }


    /**
     * 备忘录模式：行为型模式
     *    当我们在做某一件事时，在做的过程中可以手动的保存时间的当前状态，当做完后感觉不太满意希望可以退回到之前的某一步继续做，这种思想就是备忘录模式的使用。
     *    例如在编辑文件时可以使用 Ctrl + Z 就能够回到上一步，就是备忘录模式的使用。
     *
     * 备忘录模式又叫快照模式，在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态，以便以后当需要时能将该对象恢复到原先保存的状态。
     *
     * 备忘录模式主要有3中角色：
     *    1、发起者：记录当前时刻的内部状态信息，提供创建备忘录和回复备忘录的功能。
     *    2、备忘录：负责存储发起人的内部状态，在发起人需要的时候将内部状态告知发起者。
     *    3、管理者：对备忘录进行管理，提供保存和获取备忘录，但不对备忘录中的信息进行访问和修改。
     *
     * 例如：在玩游戏时游戏角色有生命力、攻击力和防御力三种内部状态。在开始之前三种状态都拥有一些数值，然后对游戏的大怪进行搏斗，消灭大怪以后，状态数据发生了变化。
     *      假设对后面的数据不满意，就可以在游戏开始之前将数据进行保存，在结束之后进行恢复，然后重新对抗大怪，知道最后满意为止。
     *
     *
     * 备忘录有两个等效的接口：
     *   1、窄接口：管理者(Caretaker)对象（和其他发起人对象之外的任何对象）看到的是备忘录的窄接口(narror Interface)，这个窄接口只允许他把备忘录对象传给其他的对象。
     *   2、宽接口：与管理者看到的窄接口相反，发起人对象可以看到一个宽接口(wide Interface)，这个宽接口允许它读取所有的数据，以便根据这些数据恢复这个发起人对象的内部状态。
     *
     * 备忘录模式根据内部存储方式的不同分为白盒和黑盒
     *
     * 白盒模式：
     *     备忘录角色对任何对象都提供一个接口，即宽接口，备忘录角色的内部所存储的状态就对所有对象公开。
     *     {@link com.zjj.learn.designmodel.work.memento.white}
     *
     * 黑盒模式：
     *     备忘录角色对发起人对象提供一个宽接口，而为其他对象提供一个窄接口。
     *     在Java语言中，实现双重接口的办法就是将 备忘录类 设计成 发起人类 的内部成员类。
     *     {@link com.zjj.learn.designmodel.work.memento.black}
     **/
}
